# -*- coding:utf-8 -*-
# title           :
# description     :
# author          :Python超人/三月三提供
# date            :2024-08-04
# link            :https://gitcode.net/pythoncr/
# python_version  :3.9
# ==============================================================================
from 神笔码靓.神笔库.元素库 import 元素模板
from 神笔码靓.神笔库.神笔绘图板 import 神笔绘图板
from 神笔码靓.神笔库.定义集 import *
from 神笔码靓.神笔库.配置 import *
from 神笔码靓.神笔库.通用工具集 import *
from 神笔码靓.神笔库 import 神笔模板
from 神笔码靓.神笔库.定义集 import *


class 电视信号测试图神笔模板(神笔模板):
    def 模板ID(self):
        return "电视信号测试图"

    def 创建帧网格(self, 元素列表_):
        绘图板 = self.绘图板
        中心位置 = self.获取参数("中心位置")
        圆半径 = self.获取参数("圆半径")
        cx, cy = 中心位置
        边线基数 = 圆半径 / 100

        帧网格宽度 = 圆半径 / 6
        帧网格高度 = 帧网格宽度 / 2
        帧网格开始X, 帧网格开始Y = cx - 圆半径, cy - 帧网格高度
        帧网格描边宽度 = 边线基数 * 1.2

        self.帧网格描边宽度 = 帧网格描边宽度
        self.帧网格开始Y = 帧网格开始Y
        self.帧网格高度 = 帧网格高度
        self.帧网格描边宽度 = 帧网格描边宽度

        for 索引值 in 范围(13):
            帧网格上 = 绘图板.画矩形(帧网格开始X + (索引值 - 0.5) * 帧网格宽度, 帧网格开始Y, 宽=帧网格宽度, 高=帧网格高度,
                           描边颜色=颜色.白色, 描边宽度=帧网格描边宽度, 填充颜色=颜色.黑色).添加到列表(元素列表_)
            帧网格下 = 绘图板.画矩形(帧网格开始X + (索引值 - 0.5) * 帧网格宽度, 帧网格开始Y + 帧网格高度, 宽=帧网格宽度, 高=帧网格高度,
                           描边颜色=颜色.白色, 描边宽度=帧网格描边宽度, 填充颜色=颜色.黑色).添加到列表(元素列表_)
            # 元素列表_.添加元素(帧网格上)
            # 元素列表_.添加元素(帧网格下)

    def 创建彩色条(self, 元素列表_):
        绘图板 = self.绘图板
        中心位置 = self.获取参数("中心位置")
        圆半径 = self.获取参数("圆半径")
        cx, cy = 中心位置

        彩色条宽度 = 圆半径 / 3
        彩色条高度 = 彩色条宽度
        彩色条开始X, 彩色条开始Y = cx - 圆半径, self.帧网格开始Y - 彩色条高度 - self.帧网格描边宽度 / 2
        self.彩色条宽度 = 彩色条宽度
        self.彩色条开始Y = 彩色条开始Y
        self.彩色条高度 = 彩色条高度
        彩色条颜色 = ["#F6FF0B", "#13FFF5", "#10FF08", "#E500ED", 颜色.红色, 颜色.蓝色]
        for 索引值 in 范围(6):
            彩色条 = 绘图板.画矩形(彩色条开始X + 索引值 * 彩色条宽度, 彩色条开始Y, 宽=彩色条宽度, 高=彩色条高度,
                          填充颜色=彩色条颜色[索引值], 描边颜色=颜色.白色, 描边宽度=0).添加到列表(元素列表_)
            # 元素列表_.添加元素(彩色条)

    def 创建反射检查(self, 元素列表_, y, 颜色1, 颜色2, 反射检查高度):
        绘图板 = self.绘图板
        中心位置 = self.获取参数("中心位置")
        圆半径 = self.获取参数("圆半径")
        cx, cy = 中心位置
        反射检查比例关系 = [208, 36, 6, 380, 208]
        反射检查和 = 求和(反射检查比例关系)
        反射检查累计X = 0
        for 索引值, 比例值 in 索引列举(反射检查比例关系):
            比率 = 比例值 / 反射检查和
            填充颜色 = 颜色1 if 索引值 % 2 == 0 else 颜色2
            宽 = 比率 * 圆半径 * 2
            反射检查 = 绘图板.画矩形(x=cx - 圆半径 + 反射检查累计X, y=y, 宽=宽, 高=反射检查高度,
                           填充颜色=填充颜色, 描边宽度=0).添加到列表(元素列表_)
            反射检查累计X += 宽
            # 元素列表_.添加元素(反射检查)

    def 创建彩条黑白参考(self, 元素列表_):
        绘图板 = self.绘图板
        中心位置 = self.获取参数("中心位置")
        圆半径 = self.获取参数("圆半径")
        cx, cy = 中心位置

        黑白参考宽度 = 圆半径 / 9
        黑白参考高度 = self.彩色条宽度 / 1.99
        黑白参考开始X, 黑白参考开始Y = cx - 圆半径, self.彩色条开始Y - 黑白参考高度

        self.黑白参考高度 = 黑白参考高度
        self.黑白参考开始Y = 黑白参考开始Y

        黑白参考累计X = 黑白参考开始X
        for 索引值 in 范围(16):
            if 索引值 == 0:
                填充颜色 = 颜色.黑色
                宽倍数 = 2

            elif 索引值 == 15:
                填充颜色 = "#BEBDC2"
                宽倍数 = 2
            else:
                宽倍数 = 1
                填充颜色 = 颜色.黑色 if 索引值 % 2 == 0 else "#BEBDC2"
            if 索引值 > 1:
                黑白参考累计X += 黑白参考宽度
            elif 索引值 == 1:
                黑白参考累计X += 黑白参考宽度 * 2
            彩条黑白参考 = 绘图板.画矩形(黑白参考累计X, 黑白参考开始Y,
                             宽=黑白参考宽度 * 宽倍数, 高=黑白参考高度, 填充颜色=填充颜色,
                             描边颜色=颜色.白色, 描边宽度=0).添加到列表(元素列表_)
            # 元素列表_.添加元素(彩条黑白参考)

    def 创建清晰度条(self, 元素列表_):
        绘图板 = self.绘图板
        中心位置 = self.获取参数("中心位置")
        圆半径 = self.获取参数("圆半径")
        cx, cy = 中心位置
        边线基数 = 圆半径 / 100

        清晰度条高度 = self.彩色条高度 * 0.98
        清晰度条开始X, 清晰度条开始Y = cx - 圆半径 * 0.76, self.帧网格开始Y + 2 * self.帧网格高度 + (self.帧网格描边宽度) / 2
        清晰度条宽度 = 边线基数 * 2
        清晰度条偏移X = 0

        self.清晰度条高度 = 清晰度条高度
        self.清晰度条开始Y = 清晰度条开始Y

        y1, y2 = 清晰度条开始Y, 清晰度条开始Y + 清晰度条高度
        for 索引值 in 范围(90):
            x = 清晰度条开始X + 清晰度条偏移X
            if 索引值 == 0:
                x0 = cx - 圆半径
                清晰度条0 = 绘图板.画矩形(x=x0, y=y1, 宽=x - x0 - 2 * 清晰度条宽度, 高=清晰度条高度, 填充颜色=颜色.黑色, 描边宽度=0).添加到列表(元素列表_)
                # 元素列表_.添加元素(清晰度条0)
            elif 索引值 == 89:
                x0 = x + 2 * 清晰度条宽度
                清晰度条_1 = 绘图板.画矩形(x=x0, y=y1, 宽=cx + 圆半径 - x0, 高=清晰度条高度, 填充颜色=颜色.黑色, 描边宽度=0).添加到列表(元素列表_)
                # 元素列表_.添加元素(清晰度条_1)

            清晰度条偏移X += 清晰度条宽度 * 2.18
            清晰度条宽度 = 清晰度条宽度 / 1.0256

            清晰度条 = 绘图板.连直线(路径点列表=[(x, y1), (x, y2)], 描边宽度=清晰度条宽度, 描边颜色=颜色.黑色).添加到列表(元素列表_)
            # 元素列表_.添加元素(清晰度条)

    def 创建灰度条(self, 元素列表_):
        绘图板 = self.绘图板
        中心位置 = self.获取参数("中心位置")
        圆半径 = self.获取参数("圆半径")
        cx, cy = 中心位置

        灰度条宽 = self.彩色条宽度
        灰度条高 = self.帧网格高度 * 2
        灰度条开始X, 灰度条开始Y = cx - 圆半径, self.清晰度条开始Y + self.清晰度条高度

        self.灰度条开始Y = 灰度条开始Y
        self.灰度条高 = 灰度条高

        灰度比 = [0, 0.2, 0.4, 0.6, 0.8, 1]
        for 索引值 in 范围(6):
            灰度值 = int((255 * 灰度比[索引值]) // 1)
            灰度色 = 颜色.RGB(灰度值, 灰度值, 灰度值)
            灰度条 = 绘图板.画矩形(灰度条开始X + 索引值 * 灰度条宽, 灰度条开始Y, 宽=灰度条宽, 高=灰度条高,
                          填充颜色=灰度色, 描边颜色=颜色.白色, 描边宽度=0).添加到列表(元素列表_)
            # 元素列表_.添加元素(灰度条)

    def 创建YC时序检查(self, 元素列表_, 反射检查高度):
        绘图板 = self.绘图板
        中心位置 = self.获取参数("中心位置")
        圆半径 = self.获取参数("圆半径")
        cx, cy = 中心位置

        YC时序检查开始X, YC时序检查开始Y = cx - 圆半径, self.灰度条开始Y + self.灰度条高 + 反射检查高度
        YC时序检查高度 = cy + 圆半径 - YC时序检查开始Y
        YC时序检查宽度 = 圆半径 / 6
        YC时序检查y = 绘图板.画矩形(YC时序检查开始X, YC时序检查开始Y, 宽=圆半径 * 2, 高=YC时序检查高度,
                          填充颜色="#FFF905", 描边宽度=0).添加到列表(元素列表_)
        YC时序检查r = 绘图板.画矩形(cx - YC时序检查宽度 / 2, YC时序检查开始Y, 宽=YC时序检查宽度, 高=YC时序检查高度,
                          填充颜色=颜色.红色, 描边宽度=0).添加到列表(元素列表_)
        # 元素列表_.添加元素(YC时序检查y)
        # 元素列表_.添加元素(YC时序检查r)

    def 元素列表(self):
        绘图板 = self.绘图板
        中心位置 = self.获取参数("中心位置")
        圆半径 = self.获取参数("圆半径")
        边线基数 = 圆半径 / 100

        方格背景行列数 = self.获取参数("方格背景行列数")
        方格背景填充色 = self.获取参数("方格背景填充色", "#808080")
        方格背景描边色 = self.获取参数("方格背景描边色", "#ffffff")
        顶端标题 = self.获取参数("顶端标题")
        顶端标题缩放 = self.获取参数("顶端标题缩放", 1)
        顶端标题字体 = self.获取参数("顶端标题字体", 系统字体.微软雅黑)
        # #808080
        cx, cy = 中心位置
        元素列表_ = 列表()
        被裁元素列表_ = 列表()

        if 方格背景行列数:
            方格行数, 方格列数 = 方格背景行列数
            方格宽 = 圆半径 / 6
            x = cx - 方格列数 * 方格宽 / 2
            y = cy - 方格行数 * 方格宽 / 2
            绘图板.画矩形(x=x, y=y, 宽=方格宽 * 方格列数, 高=方格宽 * 方格行数, 填充颜色=方格背景填充色, 描边宽度=0).添加到列表(元素列表_)
            绘图板.画表格(x=x, y=y, 列宽=方格宽, 列数=方格列数, 行高=方格宽, 行数=方格行数,
                    填充颜色=方格背景填充色, 描边宽度=边线基数, 描边颜色=方格背景描边色).添加到列表(元素列表_)

        外圆裁剪 = 绘图板.画圆(x=cx, y=cy, 半径=圆半径)
        外圆背景 = 绘图板.画圆(x=cx, y=cy, 半径=圆半径, 描边宽度=0, 填充颜色=颜色.白色).添加到列表(被裁元素列表_)
        # 元素列表_.添加元素(外圆背景)

        self.创建帧网格(被裁元素列表_)
        self.创建彩色条(被裁元素列表_)
        self.创建清晰度条(被裁元素列表_)
        self.创建彩条黑白参考(被裁元素列表_)
        self.创建灰度条(被裁元素列表_)

        反射检查高度 = self.黑白参考高度 * 0.95
        self.创建反射检查(元素列表_=被裁元素列表_, y=self.黑白参考开始Y - 反射检查高度,
                    颜色1=颜色.黑色, 颜色2=颜色.白色, 反射检查高度=反射检查高度)
        self.创建反射检查(元素列表_=被裁元素列表_, y=self.灰度条开始Y + self.灰度条高,
                    颜色1=颜色.白色, 颜色2=颜色.黑色, 反射检查高度=反射检查高度)

        顶部标题宽, 顶部标题高 = 圆半径 / 1.5, 圆半径 / 6
        顶部标题X, 顶部标题Y = cx - 顶部标题宽 / 2, self.黑白参考开始Y - 反射检查高度 - 顶部标题高
        顶部标题区 = 绘图板.画矩形(x=顶部标题X, y=顶部标题Y, 宽=顶部标题宽, 高=顶部标题高, 填充颜色=颜色.黑色, 描边宽度=0).添加到列表(被裁元素列表_)
        # 元素列表_.添加元素(顶部标题区)

        if 顶端标题:
            标题y = 顶部标题Y + 顶部标题高 / 2
            # 标题y += 12  # 转 PNG的时候调整 https://svgtopng.com/zh/
            绘图板.写字(x=cx, y=标题y, 文字=顶端标题, 字体=顶端标题字体,
                              字体大小=圆半径 / 10 * 顶端标题缩放, 填充颜色=颜色.白色).添加到列表(被裁元素列表_)

        self.创建YC时序检查(被裁元素列表_, 反射检查高度)

        测试图 = 绘图板.创建组合(元素列表=被裁元素列表_)
        裁剪 = 绘图板.裁剪(裁剪元素_=外圆裁剪, 被裁元素=测试图)

        元素列表_.添加元素(测试图)
        元素列表_.添加元素(裁剪)

        return 元素列表_
        # return [测试图, 裁剪]
